package lock8;

import java.util.concurrent.TimeUnit;
/**
 * 8锁，就是关于锁的8个问题
 * 1、标准情况下，两个线程先发短信，还是打电话？1/发短信 2/打电话
 *    synchronized 是重度锁，谁拿到锁就会阻塞，必须执行完了才会释放。
 *    线程A中加sleep，锁的是主线程。
 *    sleep的时候B还没创建，必定A先
 * 2、在sendSms方法加上sleep延迟4秒之后，是发短信还是先打电话？1/发短信 2/打电话
 *    先执行短信，4秒，主线程1s后继续的时候，A线程还在sleep，sleep没有释放锁，所以应该先发短信，然后释放锁之后再执行线程B
 *    synchronized锁的对象是方法的调用者，例子中锁的都是phone对象，两个方法用的同一个锁，谁先拿到谁先执行。
 *  *    因此执行发短信的时候会阻塞，sleep没有释放锁，所以就必须执行完发短信后释放锁才可以执行线程B。
 *
 *
 */

public class Test1 {
    public static void main(String[] args) throws InterruptedException {
        Phone phone = new Phone();
        new Thread(()->{
            phone.sendSms();
        },"A").start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            phone.call();
        },"B").start();
    }
}

class Phone {
//    synchronized 锁的对象是方法的调用者。
//    两个方法用的是同一个锁，谁先拿到谁先执行
    public synchronized void sendSms()  {

//        try {
//            TimeUnit.SECONDS.sleep(4);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        System.out.println("发短信");


    }
    public synchronized void call(){
        System.out.println("打电话");

    }
}
/*
发短信
打电话
 */